declare interface Uni {
  $tm: tmUtil;
}

declare namespace UniNamespace {
  interface CanvasToTempFilePathOptions {
    canvas?: CanvasContext;
  }
  interface CanvasContext {
    width: number;
    height: number;
    dpr: number;
    toTempFilePath(any0: any, any1: any, any2: any, any3: any, any4: any, any5: any, any6: any, any7: any, any8: any): void;
  }
  interface NodesRef {
    node(callback?: (result: any) => void): SelectorQuery;
    fields(fields: NodeField, callback?: (result: NodeInfo) => void): SelectorQuery;
  }
  interface NodeField {
    node?: boolean;
  }
}

type pagesCustomType = 'default' | 'custom';
type pagesType = {
  //页面地址
  path: string;
  name: string | undefined;
  title: string;
  meta: Object | undefined;
  //导航栏模式
  custom: pagesCustomType;
  navigationBarBackgroundColor: string;
  navigationBarTextStyle: string;
  subPackages?: Array<any>;
};
type tabBarItemType = {
  pagePath: string;
  iconPath: string;
  selectedIconPath: string;
  text: string;
};
type tabBarType = {
  color: string;
  selectedColor: string;
  borderStyle: string;
  backgroundColor: string;
  list?: Array<tabBarItemType>;
};

type fetchConfigResponseType = 'arraybuffer' | 'text';
type fetchConfigDataType = 'json' | 'text';
type fetchConfigMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'HEAD' | 'OPTIONS' | 'TRACE';

interface fetchConfigSuccessType {
  data: object | string | ArrayBuffer;
  statusCode: number;
  header: object;
  cookies: Array<string>;
}
interface fetchConfig {
  url?: string;
  data?: object | string | ArrayBuffer;
  header?: object;
  method?: fetchConfigMethod;
  timeout?: number;
  dataType?: fetchConfigDataType;
  responseType?: fetchConfigResponseType;
  sslVerify?: boolean;
  withCredentials?: boolean;
  firstIpv4?: boolean;
  success?: Function;
  fail?: Function;
  complete?: Function;
}
type openUrlType = 'navigate' | 'redirect' | 'reLaunch' | 'switchTab' | 'navigateBack';
declare interface Touch {
  readonly clientX: number;
  readonly clientY: number;
  readonly force: number;
  readonly identifier: number;
  readonly pageX: number;
  readonly pageY: number;
  readonly radiusX: number;
  readonly radiusY: number;
  readonly rotationAngle: number;
  readonly screenX: number;
  readonly screenY: number;
  readonly target: EventTarget;
  readonly x: number;
  readonly y: number;
}

declare interface TouchEvent {
  readonly changedTouches: TouchList;
}

type tmUtil = {
  //pagejson下的pages配置。
  pages: Map<string, Object>;
  //pagejson下的配置。
  tabBar: tabBarType;
  /**
   * 判断是否是颜色值
   * @param color 颜色值
   */
  isColor(color: string): boolean;
  /**
   * 国际化
   * @param key 关键字
   * @return 语言值
   */
  language(key: string): string;
  store: Object;
  http: {
    /**
     * GET请求
     * @param url 请求地址
     * @param data 请求的数据
     * @param opts 请求的配置
     * @help https://tmui.design/doc/JSTool/fetch.html
     */
    get(url: string, data?: object, opts?: fetchConfig): Promise<UniApp.GeneralCallbackResult | UniApp.RequestSuccessCallbackResult>;
    /**
     * POST请求
     * @param url 请求地址
     * @param data 请求的数据
     * @param opts 请求的配置
     * @help https://tmui.design/doc/JSTool/fetch.html
     */
    post(url: string, data?: object, opts?: fetchConfig): Promise<UniApp.GeneralCallbackResult | UniApp.RequestSuccessCallbackResult>;
    put(url: string, data?: object, opts?: fetchConfig): Promise<UniApp.GeneralCallbackResult | UniApp.RequestSuccessCallbackResult>;
    delete(url: string, data?: object, opts?: fetchConfig): Promise<UniApp.GeneralCallbackResult | UniApp.RequestSuccessCallbackResult>;
    /**
     * 自定义请求
     * @param cog 请求的配置
     * @param beforeFun 请求前执行的函数
     * @param afterFun 请求后执行的函数
     * @param complete 请求完成的函数
     * @help https://tmui.design/doc/JSTool/fetch.html
     */
    request(cog: fetchConfig, beforeFun?: Function, afterFun?: Function, complete?: Function): Promise<UniApp.GeneralCallbackResult | UniApp.RequestSuccessCallbackResult>;
  };
  /**
   * 快捷工具
   */
  u: {
    /**
     * 预览图片。
     * @param {Object} url 必填 当前预览的图片链接。
     * @param {Object} list 可以是url数组，也可以是对象，数据比如：["http:url"] or [{url:"https:url",...}]
     * @param {Object} rangKey 如果list是对象数组，需要提供url字段。
     */
    preview(url: string, list?: Array<string>, rangKey?: string): void;
    /**
     * 数据分组
     * @param {Array} oArr - 原数组列表
     * @param {Number} length - 单个数组长度
     * @return {Array}  arr - 分组后的新数组
     */
    splitData(oArr: Array<any>, length: number): Array<any>;

    /**
     * 剩余时间格式化
     * @param {Number} t - 剩余多少秒
     * @return {Object}  format - 格式后的天时分秒对象
     */
    timeMuch(t: number): string;
    /**
     * 获取时间距离当前时间
     * @param timestamp 当前时间
     * @return 返回比如：不久前，1年前这样的格式文本
     */
    getDateToNewData(timestamp?: number | string | Date): string;
    /**
     * 打电话
     * @param {String<Number>} phoneNumber - 数字字符串
     * @return Promise<boolean>
     */
    callPhone(phoneNumber: string): Promise<boolean | any>;
    /**
     * 调起客户端相机扫码。
     * @param {Boolean} onlyFromCamera true 是否只允许相机扫码识别
     * @param {Array<string>} scanType ['barCode', 'qrCode', 'datamatrix','datamatrix']
     * @returns Promise 成功返回相关数据结构
     */
    scanCode(onlyFromCamera: boolean, scanType: Array<any>): Promise<UniApp.ScanCodeSuccessRes | string>;
    /**
     * 设置剪切板内容。
     * @param {String} data
     * @returns Promise true/false
     */
    setClipboardData(data: string): Promise<boolean | string>;
    /**
     * 获取剪切板内容
     * @returns Promise 剪切板内容
     */
    getClipboardData(): Promise<string | boolean>;
    /**
     * 设置cookie数据
     * @param {String} key 键值
     * @param {String} data 值
     * @returns Boolean
     */
    setCookie(key: string, data: any): boolean;
    /**
     * 删除一个本地cookie
     * @param {String} key 键值
     * @returns Boolean
     */
    delCookie(key: string): boolean;
    /**
     * 获取一个cookie数据
     * 如果存入的是对象，返回的也是对象。如果是string返回的也是字符串。
     * @param {String} key 键
     * @returns json/string
     */
    getCookie(key: string): Object | string;
    /**
     * 向地址连接追加参数。
     * @param {string} uri 网址
     * @param {string} key 字段
     * @param {string} value 字段值
     * @returns 网址
     */
    httpUrlAddKey(uri: string, key: string, value: string): string;
    /**
     * 取url参数
     * @param {string} uri 网址
     * @param {string} key 字段
     * @returns string|undefined
     */
    getQueryString(url: string, key: string): string;
    /**
     * 取得唯一标识id
     * @param length 标识长度
     */
    getUid(length?: number): number;
    /**
     * 防抖
     * 防抖原理：在一定时间内，只有最后一次操作，再过wait毫秒后才执行函数
     * @param {Function} func 要执行的回调函数
     * @param {Number} wait 延迟的时间
     * @param {Boolean} immediate 是否要立即执行
     */
    debounce(func: Function, wait?: number, immediate?: boolean): void;
    /**
     * 节流
     * 节流原理：在一定时间内，只能触发一次
     * @param {Function} func 要执行的回调函数
     * @param {Number} wait 延时的时间
     * @param {Boolean} immediate 是否立即执行
     * @return void
     */
    throttle(func: Function, wait?: number, immediate?: boolean, timer?: number, flags?: boolean): void;
    /**
     * 深度克隆
     * @param obj Object
     */
    deepClone(obj: any): Object;
    quereyDom(t: any, node: string): any;
    /**
     * 是否是手机号码
     * @param phone 号码
     * @returns Boolean
     */
    isPhone(phone: string | number): boolean;
    /**
     * 是否含有中文
     * @param s 字符串
     * @returns Boolean
     */
    isChina(s: string): boolean;
    /**
     * 是否为空
     * @description 判断是否是null,对象是否为空，数组是否为空。是否为 undefaind，是否为 “”空字符串。
     * @param s 任意
     */
    isEmpty(s: any): boolean;
    /**
     * 是否邮箱
     * @param s 字符串
     * @returns Boolean
     */
    isEmail(s: string): boolean;
    /**
     * 是否身份证号
     * @param val 字符号或者数字
     * @returns Boolean
     * @author https://cloud.tencent.com/developer/article/1114323
     */
    isIdCard(val: string | number): boolean;
    /**
     * 是否车牌
     * @description 蓝牌5位，绿牌6位。
     * @param s 字符串
     * @returns Boolean
     */
    isIdCar(s: string): boolean;
    /**
     * 纯数字密码验证
     * @param s 字符串或者数字
     * @param len 最小长度，默认6
     * @param maxLen 最大长度，默认20
     * @returns Boolean
     */
    isPasswordOfNumber(s: number | string, le: number, maxLen: number): boolean;
    /**
     * 密码验证
     * @param s 字符串或者数字
     * @param len 最小长度，默认6
     * @param maxLen 最大长度，默认20
     * @param model 0数字和英文，1数字，英文必须包含，不允许有特殊字符，2数字和字母必须包含，可以有特殊字符。
     * @returns Boolean
     */
    isPasswordOfOther(s: string | number, len: number, maxLen: number, model: number): boolean;
    /**
     * 是否是一个有效的日期
     * @param s 字符串，数字，日期对象
     * @returns Boolean
     */
    isDate(s: string | number | Date): boolean;
    /**
     * 显示信息
     * @param word 标题
     * @param mask 不允许穿透
     * @param icon 图标
     */
    toast(word: string, mask?: boolean, icon?: any): void;
    /**
     * 获取屏幕窗口安全高度和宽度
     * 注意是针对种屏幕的统一计算，统一高度，不再让uni获取有效高度而烦恼。
     * 请一定要在onMounted或者onLoad中调用，否则不准确在h5端。
     * @return {height,width,top,isCustomHeader,sysinfo}
     */
    getWindow(): { width: number; height: number; top: number; bottom: number; isCustomHeader: Boolean; sysinfo: UniApp.GetSystemInfoResult };

    /**
     * 打开页面路径
     * @param url string 打开的页面路径
     * @param type openUrlType "navigateTo"|"redirectTo"|"reLaunch"|"switchTab"
     */
    routerTo(url: string, type: openUrlType): void;
  };
  tmicon: Array<{
    font: string;
    prefix: string;
    fontJson: Array<{
      icon_id: string;
      name: string;
      font_class: string;
      unicode: string;
      unicode_decimal: number;
    }>;
  }>;
};
